package pe.com.casadesign.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.casadesign.dao.ProductoDAO;
import pe.com.casadesign.domain.ListaProducto;
import pe.com.casadesign.domain.OperacionResultado;
import pe.com.casadesign.domain.Producto;
import pe.com.casadesign.domain.Tienda;
import pe.com.casadesign.service.ProductoService;
import pe.com.casadesign.service.util.Constantes;
import pe.com.casadesign.service.util.Funciones;

/**
 * Implementacion de ProductoService.
 * 
 * @author Pedro Vera
 * 
 */
@Service
public class ProductoServiceImpl implements ProductoService {
	private static final Logger logger = LoggerFactory.getLogger(ProductoServiceImpl.class);

    @Autowired
    private ProductoDAO productoDAO;
    
	@Override
	public ListaProducto listarProducto(Producto producto) {
		return productoDAO.listarProducto(producto);
	}

	@Override
	public Producto obtenerProducto(Producto producto, Tienda tienda) {
		Producto productoObtenido =  productoDAO.obtenerProducto(producto, tienda);
		
		try{
			String dataImagen = Funciones.leerArchivo(producto.getCodigo());
			productoObtenido.setImagen(dataImagen);
		}catch(Exception e){
			logger.error("error al leer Imagen", e);
		}
		
		return productoObtenido;
	}

	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado registrarProducto(Producto producto) {
		boolean resultado = productoDAO.registrarProducto(producto);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(producto.getCodigo()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		try{
			Funciones.escribirArchivo(producto.getCodigo(),
						    		  producto.getImagen());
		}catch(Exception e){
			logger.error("error al guardar Imagen", e);
		}
		
		return operacionResultado;
	}

	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado modificarProducto(Producto producto) {
		boolean resultado = productoDAO.modificarProducto(producto);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		try{
			Funciones.escribirArchivo(producto.getCodigo(),
						    		  producto.getImagen());
		}catch(Exception e){
			logger.error("error al guardar Imagen", e);
		}
		
		return operacionResultado;
	}

	@Override
	public OperacionResultado eliminarProducto(Producto producto) {
		boolean resultado = productoDAO.eliminarProducto(producto);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}

	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado asociarProductoComponente(Producto producto){
		boolean resultado = productoDAO.asociarProductoComponente(producto);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	public ListaProducto obtenerProductoCodProv(Producto producto, Tienda tienda) {
		return productoDAO.obtenerProductoCodProv(producto, tienda);
	}
}
